﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Project.Models;
using System.Data.SqlClient;
using System.Web.Security;
using System.Xml.Linq;
using System.Collections.Specialized;
using System.Net;
using System.IO;
using System.Text;
using Facebook;



namespace Project.Controllers
{
    public class CuentasController : Controller
    {
        //
        // GET: /Cuentas/
        Utilidades util;
        String[] StringAValidar;

        /// <summary>
        /// //
        /// </summary>
        /// <returns></returns>
        public ActionResult LogIn()
        {
            return View();
        }

        [HttpPost]
        public ActionResult LogIn(LogIng model)
        {
            Conexion con = new Conexion();
            if (ModelState.IsValid)
            {
                LogIng log = new LogIng();
                util = new Utilidades();
                //Validar si teine caractes no Deseado
                if (util.ValidarCadenaString(StringAValidar = new string[] { model.email, model.password }))
                {

                    ModelState.AddModelError("", "Los datos introducido Poseen Caracteres no Deseado.");
                }
                else
                {
                    object resultado = con.DBLogin(model);
                    if (Convert.ToString(resultado) == "8")
                    {
                        ModelState.AddModelError("", "El Email o Password Incorrecto..");
                    }
                    else
                        if (Convert.ToString(resultado) == "3")
                        {
                            ModelState.AddModelError("", "Redireccionar ha cambiar el password DEFAULT");
                        }
                        else
                            if (resultado == null)
                            {
                                ModelState.AddModelError("", "Se produjo un Error interno Intentar mas Tarde...");

                            }
                            else
                            {
                                Registrar arrendedor = (Registrar)resultado;
                                //Esto es lo que hace si todo es correcto
                                Session.Timeout = 20;
                                // Obtener los datos del propietario
                                Session["id"] = Convert.ToInt32(arrendedor.ArrendadorID);
                                Session["nombre"] = Convert.ToString(arrendedor.nombre);
                                Session["TipoUsuario"] = "ViaEmail";
                                FormsAuthentication.SetAuthCookie(arrendedor.nombre, model.recordar);

                                return RedirectToAction("Configuracion", "Cuentas");

                            }

                }

            }
            return View();
        }
        /// <summary>
        /// ///
        /// </summary>
        /// <returns></returns>
        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            Session.Abandon();
            return RedirectToAction("Index", "Home");
        }

        /// <summary>
        /// ////
        /// </summary>
        /// <returns></returns>
        public ActionResult Registrarme()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Registrarme(Registrar model)
        {


            if (ModelState.IsValid)
            {
                Registrar reg = new Registrar();
                util = new Utilidades();
                //Validar si contiene Caracters no Deseados
                if (util.ValidarCadenaString(StringAValidar = new string[] { model.nombre, model.email }))
                {

                    ModelState.AddModelError("", "Los datos introducido Poseen Caracteres no Deseado.");
                }
                else
                {


                    string resultado = reg.GuardarRegistro(model);
                    if (resultado != "Registro Guardado Satisfactoriamente")
                    {
                        ModelState.AddModelError("", resultado);
                    }
                    else
                    {
                        // Todo bien  
                        return RedirectToAction("IngresarPassword", "Cuentas", new { email = model.email });


                    }
                }
            }
            return View();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        /// 
        public ActionResult IngresarPassword(string email)
        {
            ViewBag.email = email;

            return View();
        }
        [HttpPost]
        public ActionResult IngresarPassword(CambiarDefaultPassword model)
        {
            if (ModelState.IsValid)
            {

                util = new Utilidades();
                string[] validar = { model.email, model.defaultPass, model.password };
                //validar si tiene caracters no deseado
                if (!util.ValidarCadenaString(validar))
                {
                    CambiarDefaultPassword ob = new CambiarDefaultPassword();
                    string resultado = ob.ValidarUsuario(model);
                    if (resultado != "Registro Guardado Satisfactoriamente")
                    {
                        ModelState.AddModelError("", resultado);
                    }
                    else
                    {
                        // Todo bien  
                        return RedirectToAction("LogIn", "Cuentas");


                    }


                }
                else
                {
                    ModelState.AddModelError("", "Los datos introducido Poseen Caracteres no Deseado.");
                }
            }
            return View();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        /// 


        public ActionResult Configuracion()
        {
            if (Session["id"] != null)//Para proivir el acceso a usuario no registrado
            {
                ViewBag.nombretwitter = new Conexion().GetTwitterUsername(Convert.ToInt32(Session["id"]));
                ViewBag.nombreFacebook = new Conexion().GetFacebookUsername(Convert.ToInt32(Session["id"]));
                return View();
            }
            else
            {
                return RedirectToAction("LogIn", "Cuentas");
            }
        }
      

        #region Mis Datos"
        public ActionResult MisDatos()
        {
            Registrar reg = new Registrar();
            var n = reg.GetArrendador(Convert.ToInt32(Session["id"]));

            if (n != null)
            {
                return View(n);

            }
            else
            {
                return RedirectToAction("Error", "Propiedades");
            }

        }

        [HttpPost]
        public ActionResult MisDatos(Registrar model)
        {
            if (Session["id"] != null)//Para proivir el acceso a usuario no registrado
            {
                util = new Utilidades();
                string[] cadena = { model.nombre, model.telefono, model.celular, model.NombreEmpresa };
                if (!util.ValidarCadenaString(cadena))//Validar si tine caracteres no deseados.
                {
                    Registrar reg = new Registrar();

                    reg.ModificarPropietario(model, Convert.ToInt32(Session["id"]));


                    return View();

                }
                else
                {
                    ModelState.AddModelError("", "Ha introducido caracteres no permitidos..");
                    return View();
                }
            }
            else
            {

                return RedirectToAction("LogIn", "Cuentas");
            }
        }

        public ActionResult CambiarPassword()
        {
            if (Session["id"] != null)//Para proivir el acceso a usuario no registrado
            {
                return View();
            }
            else
            {
                return RedirectToAction("LogIn", "Cuentas");
            }
        }
        [HttpPost]
        public ActionResult CambiarPassword(cambiarPassword model)
        {
           
          if (Session["id"] != null)//Para proivir el acceso a usuario no registrado
            {
                Conexion con = new Conexion();
         int result= con.DBCambiarPassword(model, Convert.ToInt32(Session["id"]));
         if (result == 7)
         {

             ModelState.AddModelError("", "Su password ha sido Modificado.");
         }
         else
         {
             if (result == -88)
             {

                 ModelState.AddModelError("", "Verifique los datos suministrados..");

             }

             else
             {
                 ModelState.AddModelError("", "Se produjo un error intente mas tarde..");
             }
         }
         return View();
            }
            else
            {

                return RedirectToAction("LogIn", "Cuentas");
            }
  
        }

        public ActionResult RecuperarPassword()
        {
            return View();
        
        }
        [HttpGet]
         public ActionResult RecuperarPasswordCompleted(string email)
        {
            util = new Utilidades();
            if (util.ValidarString(email)) {
            
            
            
            
            }
            return View();
        }
        #endregion

        #region "Todo lo de Twitter"

        public ActionResult Twitter()
        {
            Response.Redirect(new Twitter().Solicitar(Request, "Cuentas/Twitter2"));
            return View();
        }
        public ActionResult Twitter2()
        {

            NameValueCollection responseCol = new Twitter().Recibir(Request);
            Conexion con = new Conexion();
            //Obtener nombre
            string nombre = "";
            XDocument xml = XDocument.Load(String.Format("http://api.twitter.com/1/users/show.xml?user_id={0}&screen_name={1}", responseCol["user_id"], responseCol["screen_name"]));
            foreach (var item in xml.Elements().Descendants())
            {
                if (item.Name == "name")
                    nombre = item.Value;
            }
            int arrendadorid = con.RegistrarViaTwitter(responseCol["screen_name"], nombre, responseCol["oauth_token"], responseCol["oauth_token_secret"], responseCol["user_id"]);
            Session["id"] = arrendadorid;
            SqlDataReader Nombre = con.GetArrendedorById(arrendadorid);
            Nombre.Read();
            Session["nombre"] = Nombre["Nombre"];
            Session["TipoUsuario"] = "ViaTwitter";
            FormsAuthentication.SetAuthCookie(Nombre["Nombre"].ToString(), false);
            return RedirectToAction("Configuracion", "Cuentas");
            //   return View();
        }
        public ActionResult AsociarTwitter()
        {
            Response.Redirect(new Twitter().Solicitar(Request, "Cuentas/AsociadoTwitter"));
            return View();

        }

        public ActionResult AsociadoTwitter()
        {
            NameValueCollection responseCol = new Twitter().Recibir(Request);
            Conexion con = new Conexion();
            //Obtener nombre
            string nombre = "";
            XDocument xml = XDocument.Load(String.Format("http://api.twitter.com/1/users/show.xml?user_id={0}&screen_name={1}", responseCol["user_id"], responseCol["screen_name"]));
            foreach (var item in xml.Elements().Descendants())
            {
                if (item.Name == "name")
                    nombre = item.Value;
            }
            //Validar la repuest de DB
            int result = con.AsociarTwitter(responseCol["screen_name"], nombre, responseCol["oauth_token"], responseCol["oauth_token_secret"], responseCol["user_id"], int.Parse(Session["id"].ToString()));
            if (result == 7)
            {

                return View("Configuracion");
            }
            else
            {
                ModelState.AddModelError("", "Se produjo un Error");
            }
            return View();

        }
        #endregion

        #region  "Todo lo de Facebook"


        public ActionResult FacebookLogin()
        {
            FacebookEntity fb = new FacebookEntity();
            Conexion con = new Conexion();
            if (Request["code"] == null)
            {
                Response.Redirect(string.Format(
                    "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                   fb.app_id, Request.Url.AbsoluteUri, fb.scope));
                return View();
            }
            else
            {
                Dictionary<string, string> tokens = new Dictionary<string, string>();

                string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                    fb.app_id, Request.Url.AbsoluteUri, fb.scope, Request["code"].ToString(), fb.app_secret);

                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    string vals = reader.ReadToEnd();

                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
                }

                string access_token = tokens["access_token"];




                Session["id"] = fb.LoginSucceded(access_token);
                SqlDataReader Nombre = con.GetArrendedorById(Convert.ToInt32(Session["id"]));
                Nombre.Read();
                Session["nombre"] = Nombre["Nombre"];
                Session["TipoUsuario"] = "ViaFacebook";
                FormsAuthentication.SetAuthCookie(Nombre["Nombre"].ToString(), false);
                return RedirectToAction("Configuracion", "Cuentas");

            }
        }

        public ActionResult AsociarFacebook()
        {
            FacebookEntity fb = new FacebookEntity();
            Conexion con = new Conexion();
            if (Request["code"] == null)
            {
                Response.Redirect(string.Format(
                    "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                   fb.app_id, Request.Url.AbsoluteUri, fb.scope));
                return View();
            }
            else
            {
                Dictionary<string, string> tokens = new Dictionary<string, string>();

                string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                    fb.app_id, Request.Url.AbsoluteUri, fb.scope, Request["code"].ToString(), fb.app_secret);

                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    string vals = reader.ReadToEnd();

                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
                }

                string access_token = tokens["access_token"];

                  int result = fb.AsocciarSucceded(access_token, int.Parse(Session["id"].ToString()));
            if (result == 7)
            {

                return View("Configuracion");
            }
            else
            {
                ModelState.AddModelError("", "Se produjo un Error");
            }
            return View("Configuracion");
            }

        #endregion

        }
    }
}